// #ifdef H5
var wx = require('jweixin-module')
// #endif
/**
 * 显示loading
 * @param params
 */
export function uniLoading(params = {}) {
	if (typeof params === 'string') params = {
		title: params
	}
	params = {
		title: '正在加载',
		mask: true,
		...params
	}
	uni.showLoading(params)
}

/**
 * 隐藏loading
 */
export function uniHide() {
	uni.hideLoading()
}
/**
 * 扫码
 */
export function wxScanCode(params = {}) {
	return new Promise((resolve, reject) => {
		// #ifdef H5
		wx.scanQRCode({
			needResult: 1, // 默认为0，扫描结果由微信处理，1则直接返回扫描结果，
			scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码，默认二者都有
			success: function(res) {
				resolve({
					...res,
					result: res.resultStr
				})
			}
		})
		// #endif
		// #ifndef H5
		uni.scanCode({
			...params,
			success(res) {
				resolve(res)
			},
			fail(err) {
				reject(err)
			}
		})
		// #endif
	})
}
/**
 * 订餐扫码
 */
export function getScanCode() {
	return new Promise((resolve, reject) => {
		wxScanCode({
			onlyFromCamera: true
		}).then(res => {
			if (res.path && res.path.includes("/package/OrderMeal/orderMeal/orderMeal")) {
				res.path = res.path.replace('/package/OrderMeal/orderMeal/orderMeal',
					'/package/index/shop/index')
			}
			resolve(res)
		}).catch(() => reject())
	})
}
/**
 * 路由跳转
 * @param url
 * @param type
 */
export function uniLinkTo(url, type = '') {
	if (url && url !== '#') {
		switch (type) {
			case "navigateTo":
				uni.navigateTo({
					url,
					fail(res) {
						uni.switchTab({
							url
						})
					}
				})
				break
			case "switchTab":
				uni.switchTab({
					url
				})
				break
			case "reLaunch":
				uni.reLaunch({
					url
				})
				break
			case "redirectTo":
				uni.redirectTo({
					url
				})
				break
			default:
				uni.navigateTo({
					url,
					fail(res) {
						uni.switchTab({
							url
						})
					}
				})
		}
	} else {
		uni.switchTab({
			url: '/pages/index/index'
		})
	}
}

/**
 * 普通路由跳转
 * @param url
 * @param events
 * @returns {Promise<unknown>}
 */
export function uniNavigate(url, events = {}) {
	return new Promise((resolve, reject) => {
		uni.navigateTo({
			url,
			events,
			success(res) {
				resolve(res)
			},
			fail(res) {
				reject(res)
			}
		})
	})
}

/**
 * 显示模态框
 * @param params
 * @returns {Promise<unknown>}
 */
export function uniModal(params) {
	return new Promise((resolve, reject) => {
		uni.showModal({
			...params,
			success(res) {
				if (res.confirm) {
					resolve('success')
				} else {
					reject()
				}
			},
			fail(res) {
				reject(res)
			}
		})
	})
}

/**
 * 显示提示框
 * @param params
 */
export function uniToast(params) {
	if (typeof params === 'string') params = {
		title: params
	}
	uni.showToast({
		icon: "none",
		mask: false,
		...params
	})
}

/**
 * 获取图片信息
 */
export function uniGetImageInfo(src) {
	return new Promise((resolve, reject) => {
		uni.getImageInfo({
			src,
			success(res) {
				resolve(res)
			},
			fail(err) {
				reject(err)
			}
		})
	})
}

/**
 * 小程序端获取code
 * @returns {Promise<unknown>}
 */
export function uniLogin() {
	return new Promise((resolve, reject) => {
		uni.login({
			success(res) {
				resolve(res)
			},
			fail() {
				reject('wx登录获取code失败')
			}
		})
	})
}

/**
 * 预览图片
 * @param current
 * @param urls
 */
export function uniPreview(current, urls) {
	uni.previewImage({
		current,
		urls
	})
}

/**
 * 拨打电话
 * @param number
 * @param msg
 */
export function uniCall(number, msg) {
	if (number) {
		uni.makePhoneCall({
			phoneNumber: number + '' //仅为示例
		});
	} else {
		msg = msg || '未设置客服电话'
		uniToast(msg)
	}
}

/**
 * 授权检测
 * @param authStr
 * @param msg  
 * @param tips  需要授权时，如果值为false，就不提示，直接返回reject
 * @returns {Promise<unknown>}
 */
export function authorize(authStr, msg = '是否去权限管理页打开授权', tips = true) {
	return new Promise((resolve, reject) => {
		// #ifdef H5 || MP-BAIDU
		resolve()
		return
		// #endif
		uni.getSetting({
			success(res) {
				if (res.authSetting[authStr]) {
					//已经授权
					resolve()
				} else if (!tips) {
					reject()
				} else if (res.authSetting[authStr] === undefined) {
					// 从未处理过授权
					uni.authorize({
						scope: authStr,
						success: res => { //同意授权
							resolve(res)
						},
						fail: res => { //拒绝授权
							reject(res)
						}
					})
				} else if (res.authSetting[authStr] === false) {
					//已拒绝授权，弹框让用户去授权管理页打开
					uniModal({
						title: '权限管理',
						content: msg
					}).then(() => {
						uni.openSetting({ //打开授权管理页
							success(res) {
								if (res.authSetting[authStr]) { //再次判断用户是否授权
									resolve()
								} else {
									reject(res)
								}
							},
							fail(res) {
								reject(res)
							}
						})
					}).catch(() => {
						reject()
					})
				}
			},
			fail(res) {
				reject(res)
			}
		})
	})
}

/**
 * 获取用户收货地址
 * @returns {Promise<unknown>}
 */
export function uniChooseAddress() {
	return new Promise((resolve, reject) => {
		authorize('scope.address').then(() => {
			uni.chooseAddress({
				success(res) {
					resolve(res)
				},
				fail(err) {
					reject()
				}
			})
		}).catch(() => {
			reject()
		})
	})
}



/**
 * 字节小程序获取用户信息
 * @returns {Promise<unknown>}
 */

export function uniUserInfoZJ() {
	return new Promise((resolve, reject) => {
		tt.getUserInfo({
			withCredentials: true,
			success(res) {
				console.log(res, '获取到的用户信息')
				resolve(res)
			},
			fail(res) { //字节不管是第一次还是第二次都是false，所以第一次直接就要你打开设置，所以写在取消这里
				authorize('scope.userInfo').then(() => {
					tt.getUserInfo({
						withCredentials: true,
						success(res) {
							console.log(res, '获取到的用户信息')
							resolve(res)
						}
					})
				})
				console.log(res)
			}
		});
	})
}




/**
 * 获取用户当前位置
 * @returns {Promise<unknown>}
 * bol: 没有授权，是否提示授权
 */
export function unigetLocation(tips = true) {
	return new Promise((resolve, reject) => {
		authorize('scope.userLocation', "是否去权限管理页打开授权", tips).then(() => {
			uni.getLocation({
				type: 'wgs84',
				success: function(res) {
					resolve(res)
				},
				fail: function() {
					reject()
				}
			});
		}).catch(() => {
			reject()
		})
	})
}

/**
 * 复制信息
 * @param msg
 * @returns {Promise<unknown>}
 */
export function uniCopy(msg = '') {
	return new Promise((resolve, reject) => {
		if (!msg) {
			reject('复制的内容不能为空')
			return
		}
		msg = typeof msg === 'string' ? msg : msg.toString() // 复制内容，必须字符串，数字需要转换为字符串
		/**
		 * 小程序端 和 app端的复制逻辑
		 */
		//#ifndef H5
		uni.setClipboardData({
			data: msg,
			success: function() {
				resolve()
			},
			fail: function() {
				reject()
			}
		});
		//#endif

		/**
		 * H5端的复制逻辑
		 */
		// #ifdef H5
		if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
			// 不支持
			reject('浏览器不支持')
			return
		}
		let textarea = document.createElement("textarea")
		textarea.value = msg
		textarea.readOnly = "readOnly"
		document.body.appendChild(textarea)
		textarea.select() // 选择对象
		textarea.setSelectionRange(0, msg.length) //核心
		let result = document.execCommand("copy") // 执行浏览器复制命令
		if (result) {
			resolve()
		} else {
			reject("复制失败，请检查h5中调用该方法的方式，是不是用户点击的方式调用的，如果不是请改为用户点击的方式触发该方法，因为h5中安全性，不能js直接调用！")
		}
		textarea.remove()
		// #endif
	})
}

/**
 * 返回上 n 页
 * @param time
 */
export function uniBack(time = 0, params = {}) {
	setTimeout(() => {
		uni.navigateBack({
			delta: 1,
			...params,
			fail: () => {
				uni.switchTab({
					url: '/pages/index/index'
				})
			}
		})
	}, time)
}

/**
 *
 * @param params count sizeType sourceType size(单位mb)
 * @returns {Promise<unknown>}
 */
export function uniChooseImage(params = {}) {
	return new Promise((resolve, reject) => {
		let size = 0
		if (params.size) {
			size = params.size * 1024 * 1024
		}
		uni.chooseImage({
			...params,
			success(res) {
				if (size > 0) {
					if (res.tempFiles.some(item => item.size > size)) {
						uniToast({
							title: `图片超出上传限制${params.size}MB!`,
							duration: 2500
						})
						reject(`图片超出上传限制${params.size}MB!`)
					} else {
						resolve(res.tempFilePaths)
					}
				} else {
					resolve(res.tempFilePaths)
				}
			},
			fail(err) {
				reject(err)
			}
		})
	})
}

/**
 *
 * @param params
 * @returns {Promise<unknown>}
 */
export function uniChooseVideo(params = {}) {
	return new Promise((resolve, reject) => {
		let size = 0
		if (params.size) {
			size = params.size * 1024 * 1024
		}
		uni.chooseVideo({
			...params,
			success(res) {
				if (size > 0) {
					if (res.size > size) {
						uniToast({
							title: `视频超出上传限制${params.size}MB!`,
							duration: 2500
						})
						reject(`视频超出上传限制${params.size}MB!`)
					} else {
						resolve(res.tempFilePath)
					}
				} else {
					resolve(res.tempFilePath)
				}
			},
			fail(err) {
				reject()
			}
		})
	})
}

/**
 * 打开地图选择位置。
 * @param params
 * @returns {Promise<unknown>}
 */
export function uniChooseLocation(params = {}) {
	return new Promise((resolve, reject) => {
		authorize('scope.userLocation').then(() => {
			uni.chooseLocation({
				...params,
				success(res) {
					resolve(res)
				},
				fail(err) {
					reject(err)
				}
			})
		}).catch((err) => {
			reject(err)
		})
	})
}

// 打开地址选择页面
/**
 * H5 要在页面上执行：this.initWxConfig(['openAddress'])
 * isSelect 是否需要选择返回功能
 */
export function openAddress(isSelect) {
	return new Promise((resolve, reject) => {
		// #ifdef MP-ALIPAY
		my.getAddress({
			success: res => {
				resolve(res)
			},
			fail: err => {
				reject(err)
			}
		});
		// #endif
		// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO	
		uniChooseAddress().then((res) => {
			resolve(res)
		}).catch(() => {
			reject()
		})
		// #endif
		// #ifdef H5
		wx.openAddress({
			success: res => {
				resolve(res)
			},
			fail: err => {
				reject(err)
			}
		});
		// #endif
		// #ifdef APP-PLUS
		resolve()
		let str = '/package/user/address/addressList'
		if (isSelect) {
			str += '?getBack=1'
		}
		uniLinkTo(str, 'navigateTo');
		// #endif
	})
}